/**
 * 加密工具类
 * 提供Base64等加密功能
 */

/**
 * Base64编码
 * @param {String} str 要编码的字符串
 * @returns {String} Base64编码后的字符串
 */
export function base64Encode(str) {
  if (!str) return ''

  try {
    // 在uni-app中使用内置的Base64编码
    // #ifdef MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ
    return wx.arrayBufferToBase64(new TextEncoder().encode(str))
    // #endif

    // #ifdef H5 || APP-PLUS
    return btoa(unescape(encodeURIComponent(str)))
    // #endif

    // 其他平台使用手动实现
    return manualBase64Encode(str)
  } catch (error) {
    console.error('Base64编码失败:', error)
    // 降级到手动实现
    return manualBase64Encode(str)
  }
}

/**
 * Base64解码
 * @param {String} base64Str Base64编码的字符串
 * @returns {String} 解码后的字符串
 */
export function base64Decode(base64Str) {
  if (!base64Str) return ''

  try {
    // 在uni-app中使用内置的Base64解码
    // #ifdef MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ
    const buffer = wx.base64ToArrayBuffer(base64Str)
    return new TextDecoder().decode(buffer)
    // #endif

    // #ifdef H5 || APP-PLUS
    return decodeURIComponent(escape(atob(base64Str)))
    // #endif

    // 其他平台使用手动实现
    return manualBase64Decode(base64Str)
  } catch (error) {
    console.error('Base64解码失败:', error)
    return ''
  }
}

/**
 * 手动实现Base64编码（兼容性方案）
 * @param {String} str 要编码的字符串
 * @returns {String} Base64编码后的字符串
 */
function manualBase64Encode(str) {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
  let result = ''
  let i = 0

  // 将字符串转换为UTF-8字节数组
  const utf8Bytes = []
  for (let j = 0; j < str.length; j++) {
    const code = str.charCodeAt(j)
    if (code < 0x80) {
      utf8Bytes.push(code)
    } else if (code < 0x800) {
      utf8Bytes.push(0xc0 | (code >> 6))
      utf8Bytes.push(0x80 | (code & 0x3f))
    } else {
      utf8Bytes.push(0xe0 | (code >> 12))
      utf8Bytes.push(0x80 | ((code >> 6) & 0x3f))
      utf8Bytes.push(0x80 | (code & 0x3f))
    }
  }

  // Base64编码
  while (i < utf8Bytes.length) {
    const a = utf8Bytes[i++]
    const b = i < utf8Bytes.length ? utf8Bytes[i++] : 0
    const c = i < utf8Bytes.length ? utf8Bytes[i++] : 0

    const bitmap = (a << 16) | (b << 8) | c

    result += chars.charAt((bitmap >> 18) & 63)
    result += chars.charAt((bitmap >> 12) & 63)
    result += i - 2 < utf8Bytes.length ? chars.charAt((bitmap >> 6) & 63) : '='
    result += i - 1 < utf8Bytes.length ? chars.charAt(bitmap & 63) : '='
  }

  return result
}

/**
 * 手动实现Base64解码（兼容性方案）
 * @param {String} base64Str Base64编码的字符串
 * @returns {String} 解码后的字符串
 */
function manualBase64Decode(base64Str) {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
  let result = ''
  let i = 0

  // 移除非Base64字符
  base64Str = base64Str.replace(/[^A-Za-z0-9+/]/g, '')

  while (i < base64Str.length) {
    const encoded1 = chars.indexOf(base64Str.charAt(i++))
    const encoded2 = chars.indexOf(base64Str.charAt(i++))
    const encoded3 = chars.indexOf(base64Str.charAt(i++))
    const encoded4 = chars.indexOf(base64Str.charAt(i++))

    const bitmap = (encoded1 << 18) | (encoded2 << 12) | (encoded3 << 6) | encoded4

    result += String.fromCharCode((bitmap >> 16) & 255)
    if (encoded3 !== 64) result += String.fromCharCode((bitmap >> 8) & 255)
    if (encoded4 !== 64) result += String.fromCharCode(bitmap & 255)
  }

  return result
}

/**
 * 密码加密（使用Base64）
 * @param {String} password 原始密码
 * @returns {String} Base64加密后的密码
 */
export function encryptPassword(password) {
  if (!password) return ''
  return base64Encode(password)
}

/**
 * 密码解密（Base64解码）
 * @param {String} encryptedPassword Base64加密的密码
 * @returns {String} 解密后的密码
 */
export function decryptPassword(encryptedPassword) {
  if (!encryptedPassword) return ''
  return base64Decode(encryptedPassword)
}

// 默认导出
export default {
  base64Encode,
  base64Decode,
  encryptPassword,
  decryptPassword
}

